Expose source events as `events` to Liquid templating

Akinori MUSHA 9 years ago
parent
commit
c14a4ab5b6
2 changed files with 47 additions and 9 deletions
  1. 21 8
      app/models/agents/data_output_agent.rb
  2. 26 1
      spec/models/agents/data_output_agent_spec.rb

+ 21 - 8
app/models/agents/data_output_agent.rb

@@ -39,6 +39,13 @@ module Agents
39 39
               },
40 40
               "_contents": "tag contents (can be an object for nesting)"
41 41
             }
42
+
43
+        # Liquid Templating
44
+
45
+        In Liquid templating, the following variable is available:
46
+
47
+        * `events`: An array of events to being output sorted in descending order up to `events_to_show` in number.  For example, if source events contain a site title in the `site_title` key, you can put `{{events.first.site_title}}` at `template.title`.
48
+
42 49
       MD
43 50
     end
44 51
 
@@ -115,8 +122,20 @@ module Agents
115 122
     end
116 123
 
117 124
     def receive_web_request(params, method, format)
118
-      if interpolated['secrets'].include?(params['secret'])
119
-        items = received_events.order('id desc').limit(events_to_show).map do |event|
125
+      unless interpolated['secrets'].include?(params['secret'])
126
+        if format =~ /json/
127
+          return [{ error: "Not Authorized" }, 401]
128
+        else
129
+          return ["Not Authorized", 401]
130
+        end
131
+      end
132
+
133
+      source_events = received_events.order(id: :desc).limit(events_to_show).to_a
134
+
135
+      interpolation_context.stack do
136
+        interpolation_context['events'] = source_events
137
+
138
+        items = source_events.map do |event|
120 139
           interpolated = interpolate_options(options['template']['item'], event)
121 140
           interpolated['guid'] = {'_attributes' => {'isPermaLink' => 'false'},
122 141
                                   '_contents' => interpolated['guid'].presence || event.id}
@@ -165,12 +184,6 @@ module Agents
165 184
 
166 185
           return [content, 200, 'text/xml']
167 186
         end
168
-      else
169
-        if format =~ /json/
170
-          return [{ error: "Not Authorized" }, 401]
171
-        else
172
-          return ["Not Authorized", 401]
173
-        end
174 187
       end
175 188
     end
176 189
 

+ 26 - 1
spec/models/agents/data_output_agent_spec.rb

@@ -93,9 +93,10 @@ describe Agents::DataOutputAgent do
93 93
       expect(status).to eq(200)
94 94
     end
95 95
 
96
-    describe "outputtng events as RSS and JSON" do
96
+    describe "outputting events as RSS and JSON" do
97 97
       let!(:event1) do
98 98
         agents(:bob_website_agent).create_event :payload => {
99
+          "site_title" => "XKCD",
99 100
           "url" => "http://imgs.xkcd.com/comics/evolving.png",
100 101
           "title" => "Evolving",
101 102
           "hovertext" => "Biologists play reverse Pokemon, trying to avoid putting any one team member on the front lines long enough for the experience to cause evolution."
@@ -104,6 +105,7 @@ describe Agents::DataOutputAgent do
104 105
 
105 106
       let!(:event2) do
106 107
         agents(:bob_website_agent).create_event :payload => {
108
+          "site_title" => "XKCD",
107 109
           "url" => "http://imgs.xkcd.com/comics/evolving2.png",
108 110
           "title" => "Evolving again",
109 111
           "date" => '',
@@ -113,6 +115,7 @@ describe Agents::DataOutputAgent do
113 115
 
114 116
       let!(:event3) do
115 117
         agents(:bob_website_agent).create_event :payload => {
118
+          "site_title" => "XKCD",
116 119
           "url" => "http://imgs.xkcd.com/comics/evolving0.png",
117 120
           "title" => "Evolving yet again with a past date",
118 121
           "date" => '2014/05/05',
@@ -204,6 +207,28 @@ describe Agents::DataOutputAgent do
204 207
           ]
205 208
         })
206 209
       end
210
+
211
+      describe "interpolating \"events\"" do
212
+        before do
213
+          agent.options['template']['title'] = "XKCD comics as a feed{% if events.first.site_title %} ({{events.first.site_title}}){% endif %}"
214
+          agent.save!
215
+        end
216
+
217
+        it "can output RSS" do
218
+          stub(agent).feed_link { "https://yoursite.com" }
219
+          content, status, content_type = agent.receive_web_request({ 'secret' => 'secret1' }, 'get', 'text/xml')
220
+          expect(status).to eq(200)
221
+          expect(content_type).to eq('text/xml')
222
+          expect(Nokogiri(content).at('/rss/channel/title/text()').text).to eq('XKCD comics as a feed (XKCD)')
223
+        end
224
+
225
+        it "can output JSON" do
226
+          content, status, content_type = agent.receive_web_request({ 'secret' => 'secret2' }, 'get', 'application/json')
227
+          expect(status).to eq(200)
228
+
229
+          expect(content['title']).to eq('XKCD comics as a feed (XKCD)')
230
+        end
231
+      end
207 232
     end
208 233
 
209 234
     describe "outputting nesting" do